﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;
using System.Web.UI;
using System.Web.UI.WebControls;

using Baza.EF.DAL;
using Baza.EF.BLL;

namespace Pep_3014_3070.Customers
{
    public partial class CustomersHome : System.Web.UI.Page
    {

        public Reservations rezervacija
        {
            get
            {
                if (Session["rezervacija"] == null)
                {
                    Session["rezervacija"] = new Reservations();
                }
                return (Reservations) Session["rezervacija"];
            }
            set { Session["rezercavija"] = value; }
        }

        protected int totalNumberPost
        {
            get { return (int) ViewState["totalPostC"]; }
            set { ViewState["totalPostC"] = value; }
        }

        protected int startPage
        {
            get { return (int) ViewState["StartPageC"]; }
            set { ViewState["StartPageC"] = value; }
        }

        protected int maxPage
        {
            get { return (int) ViewState["MaxPageC"]; }
            set { ViewState["MaxPageC"] = value; }
        }

        protected void Page_Load(object sender, EventArgs e)
        {
            if (!IsPostBack)
            {
                totalNumberPost = DACustomers.getCountApartman();
                startPage = 0;
                maxPage = 8;
                BindData();
            }
        }

        protected string Datum;

        private void BindData()
        {
            DateTime dt = DateTime.Now;

            Datum = string.Format("{0:m}", dt);

            List<Cities> temp = DACustomers.GetAllCities();
            Cities cit = new Cities();
            cit.Name = "Select City";
            cit.CityID = 0;
            temp.Insert(0, cit);

            CityInputDropDownList.DataSource = temp;
            CityInputDropDownList.DataTextField = "Name";
            CityInputDropDownList.DataValueField = "CityID";
            CityInputDropDownList.DataBind();
            //Ovdje editovati apartmane koji su na pocetku ucitani !!!

            BindTopApartman();
        }

        //Ucitavanje podataka za registrirane korisnike, ovjde je potrebno napraviti sistem preporuke , takodjer nema uslova pretrage!
        private void BindTopApartman()
        {
            DateTime dt = DateTime.Now;

            Datum = string.Format("{0:m}", dt);
            List<ad_Customers_GetApartmans_Search_Result> tempApartm = DACustomers.getApartman(startPage, maxPage);

            int razlika = 7;

            for (int i = 0; i < tempApartm.Count; i++)
            {
                tempApartm[i].Price = Convert.ToDecimal(0);
                for (int j = 0; j < razlika; j++)
                {
                    Prices tempPrice = new Prices();
                    tempPrice = DACustomers.getPriceByApartmanID(Convert.ToInt32(tempApartm[i].ApartmentID),
                        Convert.ToDateTime(System.DateTime.Now),
                        Convert.ToDateTime(System.DateTime.Now).AddDays(j + 1));
                    if (tempPrice != null)
                        tempApartm[i].Price += Convert.ToDecimal(tempPrice.Price);
                }
                if (Convert.ToInt32(GuestDropDownList.SelectedIndex) != 0)
                    tempApartm[i].Price *= Convert.ToInt32(GuestDropDownList.SelectedIndex);

            }

            ApartmaniRepeater.DataSource = tempApartm;
            ApartmaniRepeater.DataBind();
            ApartmaniUpdatePanel.Focus();
            ApartmaniRepeater.Focus();


            rezervacija.CheckIn = DateTime.Now;
            rezervacija.CheckOut = DateTime.Now.AddDays(7);
            rezervacija.Price = 0;
            if (Convert.ToInt32(GuestDropDownList.SelectedIndex) != 0)
                rezervacija.NumberGuest = Convert.ToInt32(GuestDropDownList.SelectedIndex);
            else
                rezervacija.NumberGuest = 1;

        }

        //Ucitavanje podataka za registrirane korisnike, sa uslovima pretrage
        private void BindApartman()
        {

            DateTime cIn;
            DateTime cOut;

            if (CheckInInput.Text == "")
                cIn = DateTime.Now;
            else
                cIn = Convert.ToDateTime(CheckInInput.Text);

            if (CheckOutInput.Text == "")
                cOut = DateTime.Now;
            else
                cOut = Convert.ToDateTime(CheckOutInput.Text);

            if (cOut > cIn && cIn >= DateTime.Now)
            {
                DateTime dt = DateTime.Now;

                Datum = string.Format("{0:m}", dt);

                List<ad_Customers_Apartman_SELECT_BY_CitYID_Result> tempApartm =
                    DACustomers.getApartmansByCityID(Convert.ToInt32(CityInputDropDownList.SelectedIndex), startPage,
                        maxPage,
                        Convert.ToDateTime(CheckInInput.Text), Convert.ToDateTime(CheckOutInput.Text));

                int razlika = (Convert.ToDateTime(CheckOutInput.Text) - Convert.ToDateTime(CheckInInput.Text)).Days;

                for (int i = 0; i < tempApartm.Count; i++)
                {
                    tempApartm[i].Price = Convert.ToDecimal(0);
                    for (int j = 0; j < razlika; j++)
                    {
                        Prices tempPrice = new Prices();
                        tempPrice = DACustomers.getPriceByApartmanID(Convert.ToInt32(tempApartm[i].ApartmentID),
                            Convert.ToDateTime(CheckInInput.Text), Convert.ToDateTime(CheckInInput.Text).AddDays(j + 1));
                        if (tempPrice != null)
                            tempApartm[i].Price += Convert.ToDecimal(tempPrice.Price);
                    }
                    if (Convert.ToInt32(GuestDropDownList.SelectedIndex) != 0)
                        tempApartm[i].Price *= Convert.ToInt32(GuestDropDownList.SelectedIndex);

                }

                ApartmaniRepeater.DataSource = tempApartm;
                ApartmaniRepeater.DataBind();
                ApartmaniUpdatePanel.Focus();
                ApartmaniRepeater.Focus();

                rezervacija.CheckIn = Convert.ToDateTime(CheckInInput.Text);
                rezervacija.CheckOut = Convert.ToDateTime(CheckOutInput.Text);

                rezervacija.Price = 0;

                if (Convert.ToInt32(GuestDropDownList.SelectedIndex) != 0)
                    rezervacija.NumberGuest = Convert.ToInt32(GuestDropDownList.SelectedIndex);
                else
                    rezervacija.NumberGuest = 1;


            }
            else
                ClientScript.RegisterStartupScript(this.GetType(), "",
                    "$(document).ready(function(){alert('Unesite ispravno datum dolaska i datum odlaska !')});", true);
        }

        protected void SrchButton_Click(object sender, EventArgs e)
        {
            BindApartman();

        }

        protected void NextLinkButton_Click(object sender, EventArgs e)
        {
            if (startPage + 8 >= 0 && maxPage <= totalNumberPost)
            {
                startPage += 8;
                maxPage += 8;

                if (CheckInInput.Text != "" && CheckOutInput.Text != "" &&
                    Convert.ToInt32(CityInputDropDownList.SelectedIndex) != 0 &&
                    Convert.ToInt32(GuestDropDownList.SelectedIndex) != 0)
                    BindApartman();
                else
                    BindTopApartman();
            }
        }

        protected void PreviousLinkButton_Click(object sender, EventArgs e)
        {
            if (startPage - 8 >= 0 && maxPage - 8 >= 0)
            {
                startPage -= 8;
                maxPage -= 8;

                if (CheckInInput.Text != "" || CheckOutInput.Text != "" ||
                    Convert.ToInt32(CityInputDropDownList.SelectedIndex) != 0 ||
                    Convert.ToInt32(GuestDropDownList.SelectedIndex) != 0)
                    BindApartman();
                else
                    BindTopApartman();

            }
        }



    }


    //public class Preporuka
    //{
    
    //    private Dictionary<int, List<Ocjene>> proizvodi = new Dictionary<int, List<Ocjene>>();

    //    #region Item-based preporuka

    //    public List<Proizvodi> GetSlicneProizvode(int proizvodId)
    //    {
    //        UcitajProizvode(proizvodId);
    //        List<Ocjene> ocjene =
    //            Connection.dm.Ocjene.Where(x => x.ProizvodID == proizvodId).OrderBy(x => x.KupacID).ToList();

    //        List<Ocjene> zajednickeOcjene1 = new List<Ocjene>();
    //        List<Ocjene> zajednickeOcjene2 = new List<Ocjene>();

    //        List<Proizvodi> preporuceno = new List<Proizvodi>();

    //        //Prva petlja - lista svih proizvoda (ne uključujući onaj koji je proslijeđen u funkciju)
    //        foreach (var item in proizvodi)
    //        {
    //            foreach (Ocjene o in ocjene) //Sve ocjene aktivnog proizvoda
    //            {
    //                //Provjeriti da li je naredni proizvod (iz liste proizvodi) ocijenio isti kupac
    //                if (item.Value.Where(x => x.KupacID == o.KupacID).Count() > 0)
    //                {
    //                    zajednickeOcjene1.Add(o);
    //                    zajednickeOcjene2.Add(item.Value.Where(x => x.KupacID == o.KupacID).First());
    //                }
    //            }

    //            //Za računanje sličnosti se uzimaju samo zajedničke ocjene, odnosno ocjene istih kupaca za oba proizvoda
    //            double slicnost = GetSlicnost(zajednickeOcjene1, zajednickeOcjene2);
    //            if (slicnost > 0.6) //Granična vrijednost (treshold)
    //                preporuceno.Add(DAProizvodi.SelectById(item.Key));

    //            zajednickeOcjene1.Clear();
    //            zajednickeOcjene2.Clear();
    //        }

    //        //Lista preporučenih proizvoda
    //        return preporuceno;
    //    }

    //    //Učitava se kolekcija proizvoda i njihovih ocjena (osim onog koji se trenutno pregleda)
    //    private void UcitajProizvode(int proizvodId)
    //    {
    //        List<Proizvodi> aktivniProizvodi =
    //            Connection.dm.Proizvodi.Where(x => x.Status == true && x.ProizvodID != proizvodId).ToList();

    //        List<Ocjene> ocjene = new List<Ocjene>();
    //        foreach (Proizvodi p in aktivniProizvodi)
    //        {
    //            ocjene = Connection.dm.Ocjene.Where(x => x.ProizvodID == p.ProizvodID).OrderBy(x => x.KupacID).ToList();
    //            if (ocjene.Count > 0)
    //                proizvodi.Add(p.ProizvodID, ocjene);

    //        }
    //    }

    //    //Cosine similarity
    //    private double GetSlicnost(List<Ocjene> ocjene1, List<Ocjene> ocjene2)
    //    {
    //        if (ocjene1.Count != ocjene2.Count)
    //            return 0;

    //        int brojnik = 0;
    //        double int1 = 0;
    //        double int2 = 0;

    //        for (int i = 0; i < ocjene1.Count; i++)
    //        {
    //            brojnik += ocjene1[i].Ocjena*ocjene2[i].Ocjena;
    //            int1 += ocjene1[i].Ocjena*ocjene1[i].Ocjena;
    //            int2 += ocjene2[i].Ocjena*ocjene2[i].Ocjena;
    //        }

    //        int1 = Math.Sqrt(int1);
    //        int2 = Math.Sqrt(int2);

    //        double nazivnik = int1*int2;

    //        if (nazivnik != 0)
    //            return brojnik/nazivnik;

    //        return 0;

    //    }

    //    #endregion



    //}
}
